package com.lzh.rabbitMQ.one;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 消费者 接收消息
 */
public class Consumer {
    //队列名称
    public static final String QUEUE_NAME = "hello";
    //接收消息
    public static void main(String[] args) throws Exception {
        //创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.29.128");
        factory.setUsername("root");
        factory.setPassword("123456");
        //创建连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        /**
         * 声明接收消息，Lamda表达式实现（现在环境是jdk1.8）
         */
        DeliverCallback deliverCallback = (consuter,message) ->{
            /**
             * 这里可以自己声明一下消息，这里直接使用这个消息
             * 但是这里的message是一个消息对象
             * 而且这个消息对象包含了消息头和消息体
             * 一般我们只需要消息体就可以了，消息头一般不给别人知道
             * System.out.println(message);
             */
            System.out.println(new String(message.getBody()));

        };

        /**
         * 声明取消回调消息
         */
        CancelCallback cancelCallback = consumerTag->{
            System.out.println("消息消费的时候被中断！");
        };

        /**
         *消费者消费消息
         *  1、消费那个队列
         *  2、消费成功后是否自动答应 true 代表答应
         *  3、消费者未能成功消费消息，进行回调（如果接收不到就得写一个接收不到的内容）
         *  4、消费者取消消费的回调
         */
        channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback);
    }
}
